home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 44
/
Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso
/
Aminet
/
comm
/
misc
/
Camedia.lha
/
Camedia
/
Camedia.c
< prev
next >
Wrap
C/C++ Source or Header
|
2001-06-07
|
38KB
|
1,605 lines
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <dos/dos.h>
#include <exec/exec.h>
#include <devices/serial.h>
//#include <clib/exec_protos.h> // TetiSoft
//#include <clib/dos_protos.h> // TetiSoft
#include <proto/exec.h> // TetiSoft
#include <proto/dos.h> // TetiSoft
#include <clib/alib_protos.h>
//#include <pragma/dos_lib.h> // TetiSoft
//#include <pragma/exec_lib.h> // TetiSoft
#include "Camedia.h"
__inline void read_L1(L1 *, char* error_msg); // TetiSoft: Moved from Camedia.h
__inline void send_L1(L1, char* error_msg); // TetiSoft: Moved from Camedia.h
__inline void send_L2(L2, char* error_msg); // TetiSoft: Moved from Camedia.h
__inline L2 checksum(L1 *, L1 *); // TetiSoft: Moved from Camedia.h
struct MsgPort *SerialMP=NULL;
struct MsgPort *TimerMP=NULL;
struct IOExtSer *SerialIO=NULL;
struct timerequest *TimerIO=NULL;
ULONG WaitMask;
int get_preview=0;
int first_Packet=1;
char error_msg_buffer[256];
void clean(int entrypoint) {
switch(entrypoint) {
case 100:
case 101:
if (TimerIO) {
CloseDevice((struct IORequest *) TimerIO);
}
case 102:
if (SerialIO) {
CloseDevice((struct IORequest *) SerialIO);
}
case 103:
if (TimerIO) {
DeleteExtIO((struct IORequest *) TimerIO);
TimerIO=NULL;
}
case 104:
if (SerialIO) {
DeleteExtIO((struct IORequest *) SerialIO);
SerialIO=NULL;
}
case 105:
if (TimerMP) {
DeletePort(TimerMP);
TimerMP=NULL;
}
case 106:
if (SerialMP) {
DeletePort(SerialMP);
SerialMP=NULL;
}
};
}
void bootstrap(char *serial_device, int unit, char* error_msg) {
SerialMP=CreatePort(0,0);
if (!SerialMP) {
strcpy(error_msg, "Couldn't do CreateMsgPort() for SerialMP");
return;
}
TimerMP=CreatePort(0,0);
if (!SerialMP) {
clean(106);
strcpy(error_msg, "Couldn't do CreateMsgPort() for TimerMP");
return;
}
if (!(SerialIO = (struct IOExtSer *) CreateExtIO(SerialMP, sizeof(struct IOExtSer)))) {
clean(105);
strcpy(error_msg, "Couldn't do CreateExtIO() for SerialIO");
return;
}
if (!(TimerIO = (struct timerequest *) CreateExtIO(TimerMP, sizeof(struct timerequest)))) {
clean(104);
strcpy(error_msg, "Couldn't do CreateExtIO() for TimerIO");
return;
}
if (OpenDevice(serial_device, (ULONG) unit, (struct IORequest *) SerialIO, 0)) {
sprintf(error_msg_buffer, "Error, couldn't open %s, unit %d", serial_device, unit);
clean(103);
strcpy(error_msg, error_msg_buffer);
return;
}
SerialIO->io_RBufLen=2060;
SerialIO->io_SerFlags &=SERF_XDISABLED | SERF_RAD_BOOGIE;
SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
if (DoIO((struct IORequest *)SerialIO)) {
sprintf(error_msg_buffer, "Error, couldn't set the read buffer from %s, unit %d to 2060 bytes", serial_device, unit);
clean(103);
strcpy(error_msg, error_msg_buffer);
return;
}
if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *) TimerIO, 0L)) {
clean(102);
strcpy(error_msg, "Error, couldn't open timer device");
return;
}
WaitMask=SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_F| 1L<<SerialMP->mp_SigBit | 1L<<TimerMP->mp_SigBit;
}
void SetSerialSpeed(enum Camera_Speed cam_speed, char* error_msg ) {
long computer_speed;
switch(cam_speed) {
case CAMERA_SPEED_9600:
computer_speed=9600;
break;
case CAMERA_SPEED_19200:
case CAMERA_SPEED_INIT:
computer_speed=19200;
break;
case CAMERA_SPEED_38400:
computer_speed=38400;
break;
case CAMERA_SPEED_57600:
computer_speed=57600;
break;
case CAMERA_SPEED_115200:
computer_speed=115200;
break;
case CAMERA_SPEED_230400: // Added by TetiSoft
computer_speed=230400; // Added by TetiSoft
break; // Added by TetiSoft
default:
strcpy(error_msg, "Unknown Camera speed");
return;
}
SerialIO->io_Baud=computer_speed;
SerialIO->IOSer.io_Command = SDCMD_SETPARAMS;
if (DoIO((struct IORequest *)SerialIO)) strcpy(error_msg, "Error in SetSerialSpeed");
}
void init(enum Camera_Speed cs, char* error_msg ) {
L1 r;
int retry=0;
while (retry<MAX_RETRIES) {
SetSerialSpeed(CAMERA_SPEED_INIT, error_msg);
if (*error_msg!=0) goto init_catch;
// check speed
send_L1(Computer_Initialization_Byte, error_msg);
if (*error_msg!=0) goto init_catch;
read_L1(&r, error_msg);
if (*error_msg!=0) goto init_catch;
if (r==Camera_Signature) {
Set_Comm_Speed(cs, error_msg);
if (*error_msg!=0) goto init_catch;
return;
}
init_catch:
printf("got error in init: %s\n", error_msg);
retry++;
error_msg[0]='\0'; // TetiSoft: We must clear this before trying again...
Delay(200);
}
strcpy(error_msg, "Couldn't do init");
}
void send(L1 *cb, long length, char* error_msg) {
ULONG result;
SerialIO->IOSer.io_Length = length;
SerialIO->IOSer.io_Data = (APTR) cb;
SerialIO->IOSer.io_Command = CMD_WRITE;
TimerIO->tr_node.io_Command = TR_ADDREQUEST;
TimerIO->tr_time.tv_secs=TIMEOUT;
TimerIO->tr_time.tv_micro=0;
#ifdef comm_debug
printf("Will send %d bytes:\n", length);
print_bytes(cb, length);
#endif
SendIO((struct IORequest *) TimerIO);
SendIO((struct IORequest *) SerialIO);
while (1) {
result=Wait(WaitMask);
if (CheckIO((struct IORequest *) SerialIO) ) {
WaitIO((struct IORequest *) SerialIO);
if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
WaitIO((struct IORequest *) TimerIO);
#ifdef comm_debug
printf("Send was ok\n\n");
#endif
return;
}
if (CheckIO((struct IORequest *) TimerIO) ) {
// Timeout
WaitIO((struct IORequest *) TimerIO);
if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
WaitIO((struct IORequest *) SerialIO);
strcpy(error_msg, "timeout error");
return;
}
if (result & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F)) {
if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
WaitIO((struct IORequest *) SerialIO);
if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
WaitIO((struct IORequest *) TimerIO);
strcpy(error_msg, "User sent CTRL_C or F");
return;
}
}
}
__inline void send_L1(L1 b, char* error_msg) {
send(&b,1, error_msg);
}
__inline void send_L2(L2 s, char* error_msg) {
L2 n;
n=SetL2(s);
send((L1 *) &n, 2, error_msg);
}
void read(L1 *cb, long max_size, char* error_msg) {
ULONG result;
#ifdef comm_debug
printf("Would like to receive %d bytes\n", max_size);
#endif
SerialIO->IOSer.io_Length = max_size;
SerialIO->IOSer.io_Data = (APTR) cb;
SerialIO->IOSer.io_Command = CMD_READ;
TimerIO->tr_node.io_Command = TR_ADDREQUEST;
TimerIO->tr_time.tv_secs=TIMEOUT;
TimerIO->tr_time.tv_micro=0;
SendIO((struct IORequest *) TimerIO);
SendIO((struct IORequest *) SerialIO);
while (1) {
result=Wait(WaitMask);
if (CheckIO((struct IORequest *)SerialIO)) {
WaitIO((struct IORequest *) SerialIO);
if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
WaitIO((struct IORequest *) TimerIO);
#ifdef comm_debug
printf("Received %d bytes:\n", SerialIO->IOSer.io_Actual);
print_bytes(cb, SerialIO->IOSer.io_Actual);
printf("\n");
#endif
if (SerialIO->IOSer.io_Actual!=max_size) {
strcpy(error_msg, "Couldn't read enough");
return;
}
return;
}
if (CheckIO((struct IORequest *) TimerIO) ){
// Timeout
WaitIO((struct IORequest *) TimerIO);
if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
WaitIO((struct IORequest *) SerialIO);
strcpy(error_msg, "timeout error");
return;
}
if (result & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F)) {
if (!CheckIO((struct IORequest *) SerialIO) )AbortIO((struct IORequest *) SerialIO);
WaitIO((struct IORequest *) SerialIO);
if (!CheckIO((struct IORequest *) TimerIO) ) AbortIO((struct IORequest *) TimerIO);
WaitIO((struct IORequest *) TimerIO);
strcpy(error_msg, "User sent CTRL_C or F");
return;
}
}
}
__inline void read_L1(L1 *v, char* error_msg) {
read(v, 1, error_msg);
}
__inline void read_L2(L2 *v, char* error_msg) {
read((L1 *) v, 2, error_msg);
*v=SetL2(*v);
}
__inline void read_L4(L4 *v, char* error_msg) {
read((L1 *) v, 4, error_msg);
*v=SetL4(*v);
}
__inline L2 checksum(L1 *start, L1 *end) {
L1 *i; L2 cs=0;
for (i=start; i<end; i++)
cs=cs+(L1) *i;
return (L2) (cs &0xffff);
}
void SetIntegerRegister(enum Command_0 Register, L4 Value, char* error_msg) {
struct Command_0_Packet cmd;
L1 v;
int retries;
cmd.Packet_type=Packet_Command;
if (first_Packet) {
cmd.Packet_subtype=Packet_Subtype_First_Command;
first_Packet=0;
} else {
cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
}
cmd.Length_of_data=SetL2(6);
cmd.Command_Code=0;
cmd.Register_Number=Register;
cmd.NewValue=SetL4(Value);
cmd.checksum=SetL2(checksum((L1 *) &(cmd.Command_Code), (L1 *) &(cmd.checksum)));
#ifdef debug
print_bytes((L1 *)&cmd, sizeof(struct Command_0_Packet));
#endif
retries=0;
while (retries<MAX_RETRIES) {
send((L1 *) &cmd, sizeof(struct Command_0_Packet), error_msg);
if (*error_msg!=0) return;
read_L1(&v, error_msg);
if (*error_msg!=0) return;
if (v==Camera_Positive_Achnowledgement) return;
else if (v==Camera_Unable_to_Execute_Command) retries++;
else {
// strcpy(error_msg, "Got unexpected data from camera"); // TetiSoft: No info
sprintf(error_msg, "Got unexpected data ($%08X) from camera", v); // TetiSoft: More info
return;
}
}
}
void ReadIntegerRegister(enum Command_1 Register, L4 *value, char* error_msg) {
struct Command_1_Packet cmd;
L2 cs, ccs;
int retries=0;
L1 bb[10];
L4 *L4b;
cmd.Packet_type=Packet_Command;
if (first_Packet) {
cmd.Packet_subtype=Packet_Subtype_First_Command;
first_Packet=0;
}
else {
cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
}
cmd.Length_of_data=0x0200;
cmd.Command_Code=0x01;
cmd.Register_Number=Register;
cmd.checksum=(Register+1)<<8;
#ifdef debug
print_bytes((L1 *) &cmd, sizeof(struct Command_1_Packet));
#endif
send((L1 *) &cmd, sizeof(struct Command_1_Packet), error_msg);
/* get packet */
while (retries<MAX_RETRIES) {
read(bb, 10, error_msg);
// check consistency;
L4b=(L4 *) &bb[0];
if (*L4b!=0x03000400) {
// strcpy(error_msg, "Got unexpected data from camera"); // TetiSoft: No info
sprintf(error_msg, "Got unexpected data ($%08X) from camera", *L4b); // TetiSoft: More info
return;
}
*value= (L4) ((bb[7]<<24) + (bb[6]<<16) + (bb[5]<<8) + bb[4]);
cs=(L2) ((bb[9]<<8) + bb[8]);
ccs=(L4) (bb[4]+bb[5]+bb[6]+bb[7]);
if (cs!=ccs) {
printf("Checksum (=%x) is not calculated checksum (=%x)\n", cs, ccs);
retries++;
send_L1(Computer_Negative_Achnowledgement, error_msg);
if (*error_msg!=0) return;
} else {
send_L1(Computer_Positive_Achnowledgement, error_msg);
return; // return anyway
}
}
strcpy(error_msg, "Retry Error in ReadIntegerRegister()");
}
void TakeAction(enum Action_Code action, L1 arg, char* error_msg) {
/* struct and in this case struct Command_2_Packet has a special behavior.
When declaring an element, which takes more then one single byte
like L2 or L4, the structure will set the offset to an even number.
Example:
Offset:
struct Command_2_Packet {
0 L1 Packet_type;
1 L1 Packet_subtype;
2 L2 Length_of_data;
4 L1 Command_Code;
5 L1 Action_Code;
6 L1 single_byte;
8 L2 checksum;
}
As You see, the offset 8 at checksum is an even address. So the
memory at offset 7 will not be used.
That is normaly no problem, as long as the structre is used in memory.
But in this case, the structre will be sent to the camera as a stream of
bytes. That means also the unused byte at offset 7 will be sent, which is
of course not part of the camera protocol. That's why I can't send it directly,
I have to send it in two parts (0..6 and 7..8).
Why does the compiler this automatic offset changing? The reason is simple.
The 68000 family cpu (and mnay others too) can't access to odd addresses.
If You try, You will get an alert (=Guru message).
*/
struct Command_2_Packet cmd;
L1 bb[2]; L2 cs;
cmd.Packet_type=Packet_Command;
if (first_Packet) {
cmd.Packet_subtype=Packet_Subtype_First_Command;
first_Packet=0;
} else {
cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
}
cmd.Length_of_data=0x0300;
cmd.Command_Code=0x02;
cmd.Action_Code=action;
if (action==AC_Set_Protection_State && arg!=0) cmd.single_byte=1;
else cmd.single_byte=0;
//cs=checksum((L1 *) &(cmd.Command_Code), (L1 *) (&(cmd.single_byte)+1));
cs=(2+action+cmd.single_byte);
send((L1 *) &cmd, sizeof(struct Command_2_Packet)-3, error_msg);
if (*error_msg!=0) return;
send_L2(cs, error_msg);
if (*error_msg!=0) return;
read(bb, 2, error_msg);
if (*error_msg!=0) return;
if (bb[0]!=Camera_Positive_Achnowledgement) {
strcpy(error_msg, "Error in TakeAction, no Camera ACK");
return;
}
if (bb[1]!=Camara_Action_Complete_Notification)
strcpy(error_msg, "Error in TakeAction, no action complete notification");
return;
}
void ReadVDataRegister(enum Command_4 Register, L1 *ret, L4 *total_size, char* error_msg) {
struct Command_4_Packet cmd;
L1 *bb, local_seq_number=0;
L2 size, cs, ccs;
int retry;
L1 minibuffer[4];
bb=ret;
*total_size=0;
cmd.Packet_type=Packet_Command;
if (first_Packet) {
cmd.Packet_subtype=Packet_Subtype_First_Command;
first_Packet=0;
}
else {
cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
}
cmd.Length_of_data=0x0200;
cmd.Command_Code=4;
cmd.Register_Number=Register;
//cmd.checksum=SetL2(checksum((L1 *) &(cmd.Command_Code), (L1 *) &(cmd.checksum)));
cmd.checksum=(4+Register)<<8;
send((L1 *) &cmd, sizeof(struct Command_4_Packet), error_msg);
if (*error_msg!=0) return;
/* here, I should be able to receive one or many Data-Packages */
retry=0;
do {
read(minibuffer, 4, error_msg);
if (*error_msg!=0) return;
if (minibuffer[0]!=Packet_Last_in_Seq && minibuffer[0]!=Packet_Not_Last_in_Seq) {
strcpy(error_msg, "Got unexpected msg from camera in ReadVDataRegister()");
return;
}
if (minibuffer[1]!=local_seq_number) {
strcpy(error_msg, "Packet seq doesn't match with internal seq");
return;
}
size=(minibuffer[3]<<8) + minibuffer[2];
if (size>2048) {
strcpy(error_msg, "wrong size");
return;
}
if (retry==0) {
*total_size=*total_size+(L4) size;
}
read(bb, size+2, error_msg);
if (*error_msg!=0) return;
cs=(bb[size+1]<<8) + bb[size];
ccs=checksum((L1 *) bb, (L1 *) (bb+size));
if (cs!=ccs) {
printf("wrong checksum (got=%x, calculated=%x)\n", cs, ccs);
retry++;
}
if (retry==0) {
/* send ACK */
send_L1(Computer_Positive_Achnowledgement, error_msg);
if (*error_msg!=0) return;
if (minibuffer[0]==Packet_Last_in_Seq) return;
bb+=size;
local_seq_number++;
} else {
/* send NAK */
send_L1(Computer_Negative_Achnowledgement, error_msg);
if (*error_msg!=0) return;
retry=0;
}
} while (1);
}
#ifdef comm_debug
void print_bytes(L1 *p, long len) {
long i, j, oldi;
if (len<32) {
// print all
for (i=0;i<len;) {
oldi=i;
j=i+16;
if (j>len) j=len;
for (;i<j;i++) {
printf("%5d ", i);
}
printf("\n");
for (i=oldi;i<j;i++) {
printf("%5x ", (int) p[i]);
}
printf("\n");
}
printf("\n\n");
} else {
// print two parts
for (i=0;i<16;) {
oldi=i;
j=i+16;
for (;i<j;i++) {
printf("%5d ", i);
}
printf("\n");
for (i=oldi;i<j;i++) {
printf("%5x ", (int) p[i]);
}
printf("\n");
}
printf("\n");
for (i=len-16;i<len;) {
oldi=i;
j=i+16;
if (j>len) j=len;
for (;i<j;i++) {
printf("%5d ", i);
}
printf("\n");
for (i=oldi;i<j;i++) {
printf("%5x ", (int) p[i]);
}
printf("\n");
}
printf("\n\n");
}
}
#endif
void save_Frame(int framenumber, char *name, char *comment, char* error_msg) {
BPTR file;
struct Command_4_Packet cmd;
L1 local_seq_number=0;
L2 size, cs, ccs;
int retry, not_all_read=1;
L1 minibuffer[4];
L1 buffer[2050];
file=Open(name, MODE_NEWFILE);
if (file==NULL) {
strcpy(error_msg, "Couldn't open file");
return;
}
SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) framenumber, error_msg);
if (*error_msg!=0) {
Close(file);
DeleteFile(name);
return;
}
// ask camera to send data
cmd.Packet_type=Packet_Command;
if (first_Packet) {
cmd.Packet_subtype=Packet_Subtype_First_Command;
first_Packet=0;
}
else {
cmd.Packet_subtype=Packet_Subtype_Not_First_Command;
}
cmd.Length_of_data=0x0200;
cmd.Command_Code=4;
cmd.Register_Number=Cmd_Get_Current_Frame;
cmd.checksum=(4+Cmd_Get_Current_Frame)<<8;
send((L1 *) &cmd, sizeof(struct Command_4_Packet), error_msg);
if (*error_msg!=0) {
printf("%s\n", error_msg);
Close(file);
DeleteFile(name);
strcpy(error_msg, "ReadVDRegister:Error during sending Packet");
return;
}
// read data and save them
retry=0;
do {
// read a bit
read(minibuffer, 4, error_msg);
if (*error_msg!=0) {
Close(file);
DeleteFile(name);
return;
}
if (minibuffer[0]!=Packet_Last_in_Seq && minibuffer[0]!=Packet_Not_Last_in_Seq) {
Close(file);
DeleteFile(name);
strcpy(error_msg, "Got unexpected msg from camera");
return;
}
if (minibuffer[1]!=local_seq_number) {
printf("Packet seq#=%d doesn't match with internal seq#%d\n", minibuffer[1], local_seq_number);
Close(file);
DeleteFile(name);
strcpy(error_msg, "Packet seq# doesn't match with internal seq#");
return;
}
size=(minibuffer[3]<<8) + minibuffer[2];
if (size>2048) {
Close(file);
DeleteFile(name);
strcpy(error_msg, "wrong size (bigger then 2048");
return;
}
read(buffer, size+2, error_msg);
if (*error_msg!=0) goto catch_save_Frame;
cs=(buffer[size+1]<<8) + buffer[size];
ccs=checksum((L1 *) buffer, (L1 *) (buffer+size));
if (cs!=ccs) {
printf("wrong checksum (got=%x, calculated=%x)\n", cs, ccs);
retry++;
}
if (retry==0) {
/* send ACK */
send_L1(Computer_Positive_Achnowledgement, error_msg);
if (*error_msg!=0) goto catch_save_Frame;
if (minibuffer[0]==Packet_Last_in_Seq) not_all_read=0;
local_seq_number++;
} else {
/* send NAK */
send_L1(Computer_Negative_Achnowledgement, error_msg);
if (*error_msg!=0) goto catch_save_Frame;
retry=0;
}
goto skip_catch_save_Frame;
catch_save_Frame:
Close(file);
DeleteFile(name);
return;
skip_catch_save_Frame:
// save a bit
if (-1==Write(file, (void *) buffer, size)) {
Close(file);
DeleteFile(name);
strcpy(error_msg, "Error during writing the file");
return;
}
}
while (not_all_read!=0);
Close(file);
if (comment!=NULL) SetComment(name, comment);
return;
}
void save_Thumbnail(int framenumber, char *name, char *comment, char* error_msg) {
long size=0;
long real_size=0;
L1* buffer;
BPTR file;
Get_Length_of_Thumbnail(framenumber, &size, error_msg);
if (*error_msg!=0) return;
size=size+100; // to be sure
buffer=(L1 *)AllocMem(size, MEMF_CLEAR);
if (buffer==NULL) {
strcpy(error_msg, "not enough memory available");
return;
}
file=Open(name, MODE_NEWFILE);
if (file==NULL) {
FreeMem(buffer, size);
strcpy(error_msg, "Couldn't open file");
return;
}
SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) framenumber, error_msg);
if (*error_msg!=0) {
Close(file);
DeleteFile(name);
FreeMem(buffer, size);
return;
}
ReadVDataRegister(Cmd_Get_Current_Thumbnail, (L1 *) buffer, (L4 *) &real_size, error_msg);
if (*error_msg!=0) {
printf("%s\n", error_msg);
strcpy(error_msg, "An error occured in ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, size);\n");
Close(file);
DeleteFile(name);
FreeMem(buffer, size);
return;
}
if (-1==Write(file, (void *) buffer, real_size)) {
strcpy(error_msg, "Error during writing the file");
Close(file);
DeleteFile(name);
FreeMem(buffer, size);
return;
}
Close(file);
FreeMem(buffer, size);
if (comment!=NULL) SetComment(name, comment);
return;
}
void Set_Resolution(enum Resolution re, char* error_msg) { // TetiSoft: Added enum
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Resolution, (L4) re, error_msg);
}
void Set_Clock(time_t c, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Clock, (L4) c, error_msg);
}
void Set_Shutter_Speed(long ss, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Shutter_Speed, (L4) ss, error_msg);
}
void Set_Aperture(enum Aperture a, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Aperture, (L4) a, error_msg);
}
void Set_Color_Mode(enum Color_Mode cm, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Color_Mode, (L4) cm, error_msg);
}
void Set_Flash_Mode(enum Flash_Mode fm, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Flash_Mode, (L4) fm, error_msg);
}
void Set_Comm_Speed(enum Camera_Speed cs, char* error_msg) {
SetIntegerRegister(Cmd_Set_Comm_Speed, (L4) cs, error_msg);
if (*error_msg!=0) return;
Delay(5); // wait 0.5 seconds so camera can prepare for the change
SetSerialSpeed(cs, error_msg);
}
void Set_Bright_And_Contrast(enum Bright_Contrast bc, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Bright_And_Contrast, (L4) bc, error_msg);
}
void Set_White_Balance(enum White_Balance wb, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_White_Balance, (L4) wb, error_msg);
}
void Set_Autoshut_on_Host_Timer(int aoht, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Autoshut_on_Host_Timer, (L4) aoht, error_msg);
}
void Set_Autoshut_on_Field_Timer(int asoft, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Autoshut_on_Field_Timer, (L4) asoft, error_msg);
}
void Set_LED(enum LED_Mode lm, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_LED, (L4) lm, error_msg);
}
void Set_Lens_Mode(enum Lens_Mode lm, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Lens_Mode, (L4) lm, error_msg);
}
void Set_Date_Format(enum Date_Format df, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Date_Format, (L4) df, error_msg);
}
void Set_Exp_Meter(enum Exp_Meter em, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Set_Integer(Cmd_Set_Exp_Meter, (L4) em, error_msg);
}
void Set_Optical_Mode(int AEL_WBL, int Fisheye, int Wide, int Digital_Zoom, int BAW, char* error_msg) {
L4 r=0;
// int retries=0; // TetiSoft: unused
if (AEL_WBL) r+=0x1;
if (Fisheye) r+=0x2;
if (Wide) r+=0x4;
if (Digital_Zoom) r+=0x8;
if (BAW) {r+=0x10;} // TetiSoft: Added ;
MACRO_Set_Integer(Cmd_Set_Optical_Mode, (L4) r, error_msg);
}
void Get_Resolution(enum Resolution *re, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Resolution, error_msg);
if (*error_msg!=0) return;
switch (r) {
case Standard_Resolution:
case High_Resolution:
case Extended_Resolution:
*re=(enum Resolution) r; // TetiSoft: Added enum
return;
default:
*re=Unknown_Resolution;
}
}
void Get_Clock(time_t *c, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Clock, error_msg);
*c=(time_t) r;
}
void Get_Shutter_Speed(long *ss, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Shutter_Speed, error_msg);
*ss=(long) r;
}
void Get_Aperture(enum Aperture *a, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Aperture, error_msg);
switch (r) {
case Auto_Aperture: // Added by TetiSoft
case Low_Aperture:
case Midium_Aperture:
case High_Aperture:
*a=(enum Aperture) r; // TetiSoft: Added enum
break;
default:
*a=Unknown_Aperture;
}
}
void Get_Color_Mode(enum Color_Mode *cm, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Color_Mode, error_msg);
switch (r) {
case Color_Color_Mode:
case BAW_Color_Mode:
*cm=(enum Color_Mode) r; // TetiSoft: Added enum
break;
default:
*cm=Unknown_Color_Mode;;
}
}
void Get_Flash_Mode(enum Flash_Mode *fm, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Flash_Mode, error_msg);
switch (r) {
case Auto_Flash_Mode:
case Force_Flash_Mode:
case Off_Flash_Mode:
case Anti_Red_Eye_Flash_Mode:
case Slow_Sync_Flash_Mode:
*fm=(enum Flash_Mode) r; // TetiSoft: Added enum
break;
default:
*fm=Unknown_Flash_Mode;
}
}
void Get_Num_of_Frames_Taken(int *noft, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Num_of_Frames_Taken, error_msg);
*noft=(int) r;
}
void Get_Num_of_Frames_Left(int *nofl, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Num_of_Frames_Left, error_msg);
*nofl=(int) r;
}
void Get_Length_of_Frame(int framenumber, long *length, char* error_msg) {
L4 r=0; // TetiSoft: initialised
// int retries=0; // TetiSoft: unused
get_preview=0;
MACRO_Get_FD_Integer(framenumber, Cmd_Get_Length_of_Current_Frame, error_msg);
*length=(long) r;
}
void Get_Length_of_Thumbnail(int framenumber, long *length, char* error_msg) {
L4 r=0; // TetiSoft: initialised
// int retries=0; // TetiSoft: unused
get_preview=0;
MACRO_Get_FD_Integer(framenumber, Cmd_Get_Length_of_Current_Thumbnail, error_msg);
*length=(long) r;
}
void Get_Battery_Capacity(int *bc, char* error_msg) {
L4 r=0; // TetiSoft: initialised
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Battery_Capacity, error_msg);
*bc=(int) r;
}
void Get_Comm_Speed(enum Camera_Speed *cs, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Comm_Speed, error_msg);
r=r& 0xff;
switch(r) {
case CAMERA_SPEED_9600:
case CAMERA_SPEED_19200:
case CAMERA_SPEED_38400:
case CAMERA_SPEED_57600:
case CAMERA_SPEED_115200:
case CAMERA_SPEED_230400: // Added by TetiSoft
*cs=(enum Camera_Speed) r; // TetiSoft: Added enum
break;
default:
*cs=CAMERA_SPEED_Unknown;
}
}
void Get_Bright_And_Contrast(enum Bright_Contrast *bc, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Bright_And_Contrast, error_msg);
switch(r) {
case Normal_Bright_Contrast:
case More_Bright_Bright_Contrast:
case Less_Bright_Bright_Contrast:
case More_Contrast_Bright_Contrast:
case Less_Contrast_Bright_Contrast:
*bc=(enum Bright_Contrast) r; // TetiSoft: Added enum
break;
default:
*bc=Unknown_Bright_Contrast;
break;
}
}
void Get_White_Balance(enum White_Balance *wb, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_White_Balance, error_msg);
switch(r) {
case Auto_White_Balance:
case Skylight_White_Balance:
case Fluoresent_White_Balance:
case Thungsten_White_Balance:
case Cloudy_White_Balance:
*wb=(enum White_Balance) r; // TetiSoft: Added enum
break;
default:
*wb=Unknown_White_Balance;
break;
}
}
void Get_Autoshut_on_Host_Timer(int *asoht, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Autoshut_on_Field_Timer, error_msg);
*asoht=(int) r;
}
void Get_Autoshut_on_Field_Timer(int *asoft, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Autoshut_on_Field_Timer, error_msg);
*asoft=(int) r;
}
void Get_Available_Memory_Left(long *aml, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Available_Memory_Left, error_msg);
*aml=(int) r;
}
void Get_Lens_Mode(enum Lens_Mode *lm, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Lens_Mode, error_msg);
switch(r) {
case Macro_Lens_Mode:
case Normal_Lens_Mode:
case Infinity_Fisheye_Lens_Mode:
*lm=(enum Lens_Mode) r; // TetiSoft: Added enum
break;
default:
*lm=Unknown_Lens_Mode;
break;
}
}
void Get_LCD_Brightness(int *lb, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_LCD_Brightness, error_msg);
*lb=(int) r;
}
void Get_LCD_Autoshut_Timer(int *lat, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_LCD_Autoshut_Timer, error_msg);
*lat=(int) r;
}
void Get_Protect_State_of_Frame(int framenumber, int *psof, char* error_msg) {
L4 r=0; // TetiSoft: initialised
// int retries=0; // TetiSoft: unused
get_preview=0;
MACRO_Get_FD_Integer(framenumber, Cmd_Get_Protect_State_of_Current_Frame, error_msg);
*psof=(int) r;
}
void Get_Date_Format(enum Date_Format *df, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Date_Format, error_msg);
switch(r) {
case YY_MM_DD_Date_Format:
case DD_MM_HH_Date_Format:
case DD_P_MM_P_Date_Format: // Added by TetiSoft
*df=(enum Date_Format) r; // TetiSoft: Added enum
break;
default:
*df=Unknown_Date_Format;
break;
}
}
void Get_Exp_Meter(enum Exp_Meter *em, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Exp_Meter, error_msg);
switch(r) {
case Center_weighted_Exp_Meter:
case Spot_Exp_Meter:
case Multi_Element_Matrix_Exp_Meter:
*em=(enum Exp_Meter) r; // TetiSoft: Added enum
break;
default:
*em=Unknown_Exp_Meter;
break;
}
}
void Get_Optical_Mode(int *AEL_WBL, int *Fisheye, int *Wide, int *Digital_Zoom, int *BAW, char* error_msg) {
L4 r;
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_Integer(Cmd_Get_Optical_Mode, error_msg);
*AEL_WBL=(r & 0x1);
*Fisheye=(r & 0x2);
*Wide=(r & 0x4);
*Digital_Zoom=(r & 0x8);
*BAW=(r & 0x10);
}
void Get_Frame(int framenumber, UBYTE *buffer, long *size, char* error_msg) {
// int retries=0; // TetiSoft: unused
get_preview=0;
MACRO_Get_FD_VData(framenumber, Cmd_Get_Current_Frame, buffer, size, error_msg);
}
void Get_Thumbnail(int framenumber, UBYTE *buffer, long *size, char* error_msg) {
// int retries=0; // TetiSoft: unused
get_preview=0;
MACRO_Get_FD_VData(framenumber, Cmd_Get_Current_Thumbnail, buffer, size, error_msg);
}
void Get_Camera_ID(UBYTE *buffer, long *size, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_VData(Cmd_Get_Camera_ID, buffer, size, error_msg);
}
void Get_Serial_Number(UBYTE *buffer, long *size, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_VData(Cmd_Get_Serial_Number, buffer, size, error_msg);
}
void Get_Version(UBYTE *buffer, long *size, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_VData(Cmd_Get_Version, buffer, size, error_msg);
}
void Get_Model(char *string, long *size, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_VData(Cmd_Get_Model, string, size, error_msg);
}
/* not supported by many cameras */
void Get_Audio_Data(UBYTE *buffer, long *size, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_VData(Cmd_Get_Audio_Data, buffer, size, error_msg);
}
void Get_Camera_Summery_Data(enum Resolution *re, int *LCD_Brightness, int *Frames_Taken, char* error_msg) {
// int retries=0; // TetiSoft: unused
L4 buffer[1024]; // TetiSoft: Increased buffer (was 8)
long sizeVal; // Added by TetiSoft
long *size=&sizeVal; // TetiSoft: Fixed NULL init
MACRO_Get_FI_VData(Cmd_Get_Camera_Summery_Data, buffer, size, error_msg);
*re=(enum Resolution)SetL4(buffer[0]); // TetiSoft: Added enum
*LCD_Brightness=(int)SetL4(buffer[1]);
*Frames_Taken=(int) SetL4(buffer[2]);
}
void Get_Picture_Summery_Data(int framenumber, long *AudioDataLength, enum Resolution *re, int *ProtectionState, time_t *TimeDate, char* error_msg) {
// int retries=0; // TetiSoft: unused
L4 buffer[1024]={0}; // TetiSoft: Increased buffer (was 8), initialised it
long sizeVal=0; // Added by TetiSoft
long *size=&sizeVal; // TetiSoft: Fixed NULL init
get_preview=0;
MACRO_Get_FD_VData(framenumber, Cmd_Get_Picture_Summery_Data, buffer, size, error_msg);
if (*error_msg!=0) return;
if ((*size)<20) {
strcpy(error_msg, "wrong size of data packet");
return;
}
*AudioDataLength=(long)SetL4(buffer[2]);
switch(SetL4(buffer[3])) {
case Standard_Resolution:
case High_Resolution:
case Extended_Resolution:
*re=(enum Resolution)SetL4(buffer[3]); // TetiSoft: Added enum
break;
default:
*re=Unknown_Resolution;
break;
}
*ProtectionState=(int) SetL4(buffer[4]);
*TimeDate=(time_t) SetL4(buffer[5]);
}
void Get_Manufacturer(char *string, long *size, char* error_msg) {
// int retries=0; // TetiSoft: unused
MACRO_Get_FI_VData(Cmd_Get_Manufacturer, string, size, error_msg);
}
void Get_Preview(UBYTE *buffer, long *size, char* error_msg) {
TakeAction(AC_Take_Preview_Snapshot, 0, error_msg);
if (*error_msg!=0) {
printf("%s\n", error_msg);
strcpy(error_msg, "An error occured in TakeAction(AC_Take_Preview_Snapshot, 0);");
return;
}
if (get_preview==0) {
SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) 0, error_msg);
if (*error_msg!=0) {
printf("%s\n", error_msg);
strcpy(error_msg, "An error occured in SetIntegerRegister(Cmd_Set_Current_Frame_Number, (L1) 0);");
return;
}
}
get_preview=1;
ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, (L4 *) size, error_msg);
if (*error_msg!=0) {
printf("%s\n", error_msg);
strcpy(error_msg, "An error occured in ReadVDataRegister(Cmd_Get_Current_Frame, (L1 *) buffer, size);\n");
}
return;
}
char* dump_Resolution(enum Resolution r) {
switch (r) {
case Standard_Resolution:
return "Standard";
case High_Resolution:
return "High";
case Extended_Resolution:
return "Extended";
default:
return "Unknown";
}
}
char* dump_Aperture(enum Aperture a) {
switch(a) {
case Auto_Aperture: // Added by TetiSoft
return "Auto"; // Added by TetiSoft
case Low_Aperture:
return "Low";
case Midium_Aperture:
return "Midium";
case High_Aperture:
return "High";
default:
return "Unknown";
}
}
char* dump_Color_Mode(enum Color_Mode cm) {
switch(cm) {
case Color_Color_Mode:
return "Color";
case BAW_Color_Mode:
return "B&W";
default:
return "Unknown";
}
}
char* dump_Flash_Mode(enum Flash_Mode fm) {
switch(fm) {
case Auto_Flash_Mode:
return "Auto";
case Force_Flash_Mode:
return "Force";
case Off_Flash_Mode:
return "Off";
case Anti_Red_Eye_Flash_Mode:
return "Anti_Red_Eye";
case Slow_Sync_Flash_Mode:
return "Slow_Sync";
default:
return "Unknown";
}
}
char* dump_Camera_Speed(enum Camera_Speed cs) {
switch (cs) {
case CAMERA_SPEED_INIT:
return "init-speed (=19200)";
case CAMERA_SPEED_9600:
return "9600";
case CAMERA_SPEED_19200:
return "19200";
case CAMERA_SPEED_38400:
return "38400";
case CAMERA_SPEED_57600:
return "57600";
case CAMERA_SPEED_115200:
return "115200";
case CAMERA_SPEED_230400: // Added by TetiSoft
return "230400"; // Added by TetiSoft
default:
return "Unknown";
}
}
char* dump_Bright_Contrast(enum Bright_Contrast bc) {
switch (bc) {
case Normal_Bright_Contrast:
return "Normal_Bright";
case More_Bright_Bright_Contrast:
return "More_Bright";
case Less_Bright_Bright_Contrast:
return "Less_Bright";
case More_Contrast_Bright_Contrast:
return "More_Contrast";
case Less_Contrast_Bright_Contrast:
return "Less_Contrast";
default:
return "Unknown";
}
}
char* dump_White_Balance(enum White_Balance wb) {
switch (wb) {
case Auto_White_Balance:
return "Auto";
case Skylight_White_Balance:
return "Skylight";
case Fluoresent_White_Balance:
return "Fluoresent";
case Thungsten_White_Balance:
return "Thungsten";
case Cloudy_White_Balance:
return "Cloudy";
default:
return "Unknown";
}
}
char* dump_Lens_Mode(enum Lens_Mode lm) {
switch (lm) {
case Macro_Lens_Mode:
return "Macro";
case Normal_Lens_Mode:
return "Normal";
case Infinity_Fisheye_Lens_Mode:
return "Infinity_Fisheye";
default:
return "Unknown";
}
}
char* dump_Date_Format(enum Date_Format df) {
switch (df) {
case YY_MM_DD_Date_Format:
return "YY MM DD";
case DD_MM_HH_Date_Format:
return "DD MM HH";
case DD_P_MM_P_Date_Format: // Added by TetiSoft
return "D. M. 'YY"; // Added by TetiSoft
default:
return "Unknown";
}
}
char* dump_Exp_Meter(enum Exp_Meter em) {
switch (em) {
case Center_weighted_Exp_Meter:
return "Center_weighted";
case Spot_Exp_Meter:
return "Spot";
case Multi_Element_Matrix_Exp_Meter:
return "Multi_Element_Matrix";
default:
return "Unknown";
}
}
char* dump_LED_Mode(enum LED_Mode lm) {
switch (lm) {
case Off_LED_Mode:
return "Off";
case On_LED_Mode:
return "On";
case Blink_LED_Mode:
return "Blink";
default:
return "Unknown";
}
}